--- permalink: /nb/parcoursup/ layout: nb author_profile: false toc: true toc_label: Sommaire toc_sticky: true --- {% raw %}

Statistiques sur Parcoursup

alt="">

Nous étudions les données des affectations post-bac pour la rentrée 2021, qui apportent beaucoup de nouveautés : nouveau bac, nouvelle plateforme Parcoursup et nouvelle filière MP2I (maths-physique-informatique) dans laquelle j'enseigne.

Chargement des données

Chargeons les données sur https://data.enseignementsup-recherche.gouv.fr/pages/home/?flg=fr, en ne conservant que les colonnes les plus intéressantes et en les renommant pour plus de clarté :

In [1]:
import plotly.graph_objects as go
from plotly.subplots import make_subplots
from IPython.display import Image
import pandas as pd
import plotly.express as px

df = pd.read_csv("https://data.enseignementsup-recherche.gouv.fr/explore/dataset/fr-esr-parcoursup/download/?format=csv&timezone=Europe/Berlin&lang=fr&use_labels_for_header=true&csv_separator=%3B", sep=";") \
    .iloc[:, [110, 3, 5, 7, 8, 9, 17, 45, 82, 83, 84, 85, 101, 107]] \
    .rename(columns={"Effectif total des candidats pour une formation": "Candidats", "% d’admis néo bacheliers sans mention au bac": "Sans Mention", "% d’admis néo bacheliers avec mention Assez Bien au bac": "Mention Assez Bien", "% d’admis néo bacheliers avec mention Bien au bac": "Mention Bien", "% d’admis néo bacheliers avec mention Très Bien au bac": "Mention Très Bien", "Rang du dernier appelé du groupe 1": "Rang dernier appelé", "Taux d’accès des candidats ayant postulé à la formation (ratio entre le dernier appelé et le nombre vœux PP)": "Taux d'accès", "LIB_FOR_VOE_INS": "Filière", "Effectif total des candidats ayant accepté la proposition de l’établissement (admis)": "Effectif"}) \
    .dropna()

Statistiques générales

In [2]:
import plotly.io as pio
pio.renderers.default = 'notebook' 

df.describe()
Out[2]:
Candidats Effectif Sans Mention Mention Assez Bien Mention Bien Mention Très Bien Rang dernier appelé Taux d'accès
count 12488.000000 12488.000000 12488.000000 12488.000000 12488.000000 12488.000000 12488.000000 12488.000000
mean 892.868354 49.867873 29.926929 37.346903 23.227295 8.123222 410.780750 52.515375
std 1392.256044 82.926360 22.574331 18.256095 17.774412 14.174898 979.160647 27.834964
min 3.000000 1.000000 0.000000 0.000000 0.000000 0.000000 1.000000 1.000000
25% 201.000000 15.000000 10.298828 26.699219 10.500000 0.000000 32.000000 30.000000
50% 421.000000 27.000000 29.199219 38.500000 20.000000 2.800000 95.000000 48.000000
75% 938.000000 47.000000 45.500000 50.000000 33.296875 9.100000 358.000000 74.000000
max 18190.000000 1569.000000 100.000000 100.000000 100.000000 100.000000 15836.000000 100.000000

On observe que l'effectif moyen dans une formation est environ 50, avec un maximum de 1569 pour la formation suivante :

In [3]:
df.iloc[[df["Effectif"].argmax()]]
Out[3]:
Filière Établissement Département de l’établissement Académie de l’établissement Commune de l’établissement Sélectivité Candidats Effectif Sans Mention Mention Assez Bien Mention Bien Mention Très Bien Rang dernier appelé Taux d'accès
13063 Licence - Portail Droit - parcours Droit Université Toulouse 1 Capitole Haute-Garonne Toulouse Toulouse formation non sélective 8385 1569 26.796875 41.5 25.597656 5.5 6215.0 72.0
In [4]:
df.hist(bins=30, figsize=(20, 10));

Effectifs

Voici le pourcentage de l'effectif total dans les 15 premières formations :

In [5]:
df_effectif = df.groupby("Filière").sum().sort_values("Effectif", ascending=False)[:15]

px.pie(df_effectif, values="Effectif", names=df_effectif.index, title="Pourcentage des effectifs par filière") \
  .show(renderer="notebook")
In [123]:
df_cpge = df[df["Filière"].str.contains("CPGE")]
mentions = ["Sans Mention", "Mention Assez Bien", "Mention Bien", "Mention Très Bien"]
col = mentions + ["Taux d'accès"]
df_cpge[mentions] = df_cpge[mentions].mul(df_cpge["Effectif"], axis=0)/100.
df_cpge_mention = df_cpge.groupby("Filière").count().sort_values("Effectif", ascending=False)[:11]
px.pie(df_cpge_mention, values="Effectif", names=df_cpge_mention.index, title="Nombre de classes par filière de CPGE") \
  .show(renderer="notebook")

Sélectivité

In [124]:
df_mention = df_cpge.groupby("Filière").agg(dict({m: "sum" for m in col}, **{"Effectif": "sum"}))
df_m = df_mention[mentions].div(df_mention["Effectif"], axis=0).loc[df_cpge_mention.index].sort_values("Mention Très Bien", ascending=False)
px.bar(df_m) \
  .show(renderer="notebook")
In [122]:
df_mention = df_cpge.groupby("Filière").agg({"Taux d'accès": "mean"}).loc[df_cpge_mention.index].sort_values(by="Taux d'accès")
px.bar(df_mention, labels={"Taux d'accès"}) \
  .show(renderer="notebook")
In [ ]:
 
{% endraw %}